//实现继承

//1.组合继承 (缺点是调用了两次父类)
function Person(name,age) {
    
    this.name = name;
    this.age = age;
    this.hobbies = [];
    if (typeof(this.sayWord) != 'function') {                
        Person.prototype.sayWord = function () {
            console.log("Person:My name is "+this.name);
        }
        
    }
}

function Boy(name,age) {
    Person.apply(this,arguments); //继承实例属性 call 的话要逐个传参 第一次调用父类
    //Boy.prototype = new Person(); //在这里面写不能实现继承方法
    
}
Boy.prototype = new Person(); //继承方法 第二次调用
Boy.prototype.constructor = Boy;

var boy1 = new Boy('john',10);
console.log('boy1.sayWord ==:',boy1.sayWord);
boy1.sayWord();

//2.寄生式和组合式结合的继承方式是最理想的 

function extendsFn(subCls,SuperCls){
    var proto = Object.create(SuperCls.prototype);
    proto.constructor = subCls;
    subCls.prototype = proto;
}

function Girl(name,age){
    Person.apply(this,arguments); //继承属性
}
extendsFn(Girl,Person);//继承原型链

var g1 = new Girl('lily',25);
console.log(g1);

//2017年12月20日18:20:06 173页